//
//  DynamicColumnFieldViewController.h
//  mcrmSAAS
//
//  Created by wjxfhxy on 15-3-9.
//  Copyright (c) 2015年 GuangZhouXuanWu. All rights reserved.
//

#import "DynamicColumnFieldCoreImport.h"

@interface DynamicColumnFieldViewController : UIViewController<DynamicColumnFieldCoreDataSource,DynamicColumnFieldCoreDelegate>
{
    DynamicColumnFieldCore *_core;
    
    XMSQueueDictionary *_constraint;
    
    DynamicColumnFieldViewType _vclType;
    
    id _packObj;
    
    XMSQueueDictionary *_transformMap;
    
    RSWDataOperation *_manager;
}

/**
 *  若子类重写此方法，且返回ExpandDynamicCell(isKindOf)不为空，则界面上呈现的cell为该返回，需要与dynamicColumnCellWillCaleHeight:共同使用
 *
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (ExpandDynamicCell*)dynamicColumnCellWillCreate:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，能修改由父类默认生成的cell
 *
 *  @param cell 创建的cell
 */
- (void)dynamicColumnCell:(ExpandDynamicCell*)cell didCreate:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回不为0，则界面上呈现的cell的高度为该返回
 *
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (CGFloat)dynamicColumnCellWillCaleHeight:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值与入参不一致，则界面上呈现的值为该返回值
 *
 *  @param value         将要格式化的值
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (id)formatDynamicColumnCellValue:(id)value fieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值YES，则表示子类处理此cell的点击消息
 *
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (BOOL)handlerDynamicColumnCellDidSelected:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值与传入值不一致，则表示子类已修改默认日期
 *
 *  @param dateString 对应于cell的描述
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (NSDate*)datePickerDefaultDate:(NSString*)dateString fieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值 >= 0，则表示子类已修改选择框默认值
 *
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (NSInteger)pickerDefaultRowInFieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值 >= 0，则表示子类已修改选择框默条数
 *
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (NSInteger)pickerNumberOfRowInFieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值 != nil，则表示返回滚动选择的标题
 *
 *  @param row 对应于行数
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (NSString*)pickerTitleForRow:(NSInteger)row inFieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，且返回值 != nil，则表示子类已选择的标题
 *
 *  @param nIndex 对应于行数
 *  @param fieldDescript 对应于cell的描述
 *
 *  @return 返回
 */
- (NSString*)pickerSelectedTitleAtIndex:(NSInteger)nIndex inFieldDescript:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，处理SwitchSelectGroupTableCell事件
 *  @param fieldDescript 对应于cell的描述
 */
- (void)didSelectedSwitchSelectGroupTableCell:(FieldDescript*)fieldDescript;

/**
 *  若子类重写此方法，返回字符串不为空，则显示分组标题
 *  @param group 分组
 */
- (id)groupTitleInGroup:(NSUInteger)group;

/**
 *  刷新界面
 */
- (void)reloadDyanmicField;

/**
 *  验证cell中的值是否符合FieldDescript的描述
 *
 *  @param constraint   界面约束
 *  @return 返回
 */
- (BOOL)verifyDynamicField:(XMSQueueDictionary*)constraint;

/**
 *  提取cell中的值到给定的packObj
 *
 *  @param constraint       界面约束
 *  @param transformMap     packObj属性到FieldDescript的映射关系
 *  @param packObj          packObj
 *  @param specialExtract   特殊处理
 */
- (void)extractDynamicFieldValue:(XMSQueueDictionary*)constraint transformMap:(XMSQueueDictionary*)transformMap packObj:(id)packObj specialExtract:(BOOL(^)(FieldDescript *fieldDescript))specialExtract;

- (XUIGroupTableView*)getGrouptableView;
@end
